/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package sdc;

/**
 * ネットワークにおけるアドレスを表すクラス．
 * @author yamazaki
 */
public final class Address {

    /**
     * アドレス比較において，
     * 1) マッチしない
     * 2) ネットワーク部のみマッチ
     * 3) ホスト部までマッチ
     * の3種類を表すEnumクラス．
     */
    public static enum MatchType {
        NO_MATCH,
        HALF_MATCH,
        FULL_MATCH,
    }

    /**
     * ネットワーク部
     */
    private final int networkAddress;

    /**
     * ホスト部
     */
    private final int hostAddress;

    /**
     * 指定の値のアドレスを生成．
     * @param networkAddress ネットワーク部
     * @param hostAddress ホスト部
     */
    public Address(int networkAddress, int hostAddress) {
        this.networkAddress = networkAddress;
        this.hostAddress = hostAddress;
    }

    /**
     * @return the networkAddress
     */
    public int getNetworkAddress() {
        return networkAddress;
    }

    /**
     * @return the hostAddress
     */
    public int getHostAddress() {
        return hostAddress;
    }

    /**
     * 指定のアドレスを比較し，そのMatchTypeを返す．
     * @param a1 アドレス
     * @param a2 アドレス
     * @return MatchType
     */
    public static MatchType match(Address a1, Address a2) {
        if(a1.getNetworkAddress() == a2.getNetworkAddress()) {
            if(a1.getHostAddress() == a2.getHostAddress()) {
                return MatchType.FULL_MATCH;
            } else {
                return MatchType.HALF_MATCH;
            }
        } else {
            return MatchType.NO_MATCH;
        }
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Address other = (Address) obj;
        if (this.networkAddress != other.networkAddress) {
            return false;
        }
        if (this.hostAddress != other.hostAddress) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 89 * hash + this.networkAddress;
        hash = 89 * hash + this.hostAddress;
        return hash;
    }

    @Override
    public String toString() {
        return "Address{" + networkAddress + "." + hostAddress + '}';
    }

}
